package com.ruoyi.web.controller.common;


import cn.hutool.core.util.ObjectUtil;
import com.ruoyi.baseMain.service.IBaseAccountService;
import com.ruoyi.baseMain.service.IBaseCustomService;
import com.ruoyi.bill.service.IBillCustomInvestService;
import com.ruoyi.common.constant.CacheConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.utils.redis.RedisUtils;
import com.ruoyi.common.utils.spring.SpringUtils;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import org.redisson.api.RedissonClient;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * @author linziheng
 */
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/dashboard")
public class DashboardController {

    private final IBaseAccountService iBaseAccountService;
    private final IBillCustomInvestService iBillCustomInvestService;
    private final IBaseCustomService iBaseCustomService;
    /**
     * 获取最近7天日期
     */
    @GetMapping("/getDashData")
    public R getDashData() {
        HashMap dashData = RedisUtils.getCacheObject("dashData");
        if (dashData == null) {
            getNowWeek(); // 假设这个方法有必要的副作用
            dashData = RedisUtils.getCacheObject("dashData");
        }
        return R.ok(dashData);
    }
    @GetMapping("/getNowWeek")
    public R getNowWeek() {

        /**
         * 获取最近7天的数据，并返回封装后的结果
         *
         * @return 包含最近7天数据的封装结果
         */
        SimpleDateFormat dateFormat = new SimpleDateFormat("MM月dd日");
        String[] dateStrs = new String[7];
        Date date = new Date();
        Calendar calendar = Calendar.getInstance();
        for (int i = 6; i >= 0; i--) {
            calendar.setTime(date);
            calendar.add(Calendar.DATE,-1);
            date = calendar.getTime();
            String dateStr = dateFormat.format(date);
            if(i==6){
                dateStr += "            ";

            }
            dateStrs[i] = dateStr;
        }

        // 获取数据量
        int[] nums = new int[dateStrs.length];
        for (int i = 0; i < dateStrs.length; i++) {
            nums[i] = iBaseAccountService.getWeekList(dateStrs[i]);
        }



        Map dateMap = DateUtil();

        Map map = getNowWeekData(dateMap,dateStrs);

        Map cusMap = getNowWeekCusData(dateMap,dateStrs);
        Map currencyMap = getNowWeekCurrencyData(dateMap,dateStrs);

        map.putAll(cusMap);
        map.putAll(currencyMap);

        map.put("dateStrs",dateStrs);
        Double currency = iBillCustomInvestService.countCurrency();
        int custom = iBaseCustomService.countCustom();
        int account = iBaseAccountService.countAccount();

        map.put("currency",currency);
        map.put("custom",custom);
        map.put("account",account);
        RedisUtils.setCacheObject("dashData",map);
        return R.ok(map);
    }
    /**
     * 计算返回两个日期数组
     */
    public Map DateUtil() {
        // 存储日期字符串数组
        String[] dateStrs = new String[7];
        // 存储另一个日期字符串数组（重复计算）
        String[] dateStrs2 = new String[7];
        // 存储数据量Map
        Map map = new HashMap();
        // 创建日期格式化对象
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        // 存储最近7天的日期字符串数组
        Date date = new Date();
        // 获取日历对象
        Calendar calendar = Calendar.getInstance();
        // 逆序遍历7天
            for (int i = 6; i >= 0; i--) {
            // 设置日历的时间为当前日期
            calendar.setTime(date);
            // 将日期减去一天
            calendar.add(Calendar.DATE,-1);
            // 获取减去一天后的日期
            date = calendar.getTime();
            // 将日期格式化为字符串
            String dateStr = dateFormat.format(date);
            // 将格式化后的日期字符串存入数组
            dateStrs[i] = dateStr;
        }
        // 再次逆序遍历7天（重复计算）
            for (int i = 6; i >= 0; i--) {
            // 设置日历的时间为当前日期
            calendar.setTime(date);
            // 将日期减去一天
            calendar.add(Calendar.DATE,-1);
            // 获取减去一天后的日期
            date = calendar.getTime();
            // 将日期格式化为字符串
            String dateStr = dateFormat.format(date);
            // 将格式化后的日期字符串存入数组
            dateStrs2[i] = dateStr;
        }

            map.put("dateStrs", dateStrs);
            map.put("dateStrs2", dateStrs2);
            return map;
    }

    /**
     查询广告笔数最近7天数据
     */
    public Map getNowWeekCurrencyData(Map Datemap,String[] cloums) {
        // 获取日期字符串数组
        String[] dateStrs = (String[])Datemap.get("dateStrs");
        String[] dateStrs2 = (String[])Datemap.get("dateStrs2");
        // 创建一个Map对象用于存储结果
        Map map = new HashMap();
        // 存储每天的数据量数组
        // 获取数据量
        int[] nums = new int[dateStrs.length];
        // 遍历日期字符串数组
        for (int i = 0; i < dateStrs.length; i++) {
            // 调用服务获取每天的数据量
            nums[i] = iBillCustomInvestService.getWeekList(dateStrs[i]);
        }

        // 存储另一个每天的数据量数组（重复计算）
        int[] nums2 = new int[dateStrs2.length];
        // 遍历另一个日期字符串数组
        for (int i = 0; i < dateStrs2.length; i++) {
            // 调用服务获取每天的数据量
            nums2[i] = iBillCustomInvestService.getWeekList(dateStrs2[i]);
        }

        // 将数据量数组存入Map
        Map purchases = new HashMap();
        purchases.put("expectedData",nums2);
        purchases.put("actualData",nums);
        purchases.put("cloums",cloums);

        map.put("purchases",purchases);
        return map;
    }

        /**
          查询客户列表最近7天数据
         */
        public Map getNowWeekCusData(Map Datemap,String[] cloums) {
            // 获取日期字符串数组
            String[] dateStrs = (String[])Datemap.get("dateStrs");
            String[] dateStrs2 = (String[])Datemap.get("dateStrs2");
            // 创建一个Map对象用于存储结果
            Map map = new HashMap();

            // 存储每天的数据量数组
            // 获取数据量
            int[] nums = new int[dateStrs.length];
            // 遍历日期字符串数组
            for (int i = 0; i < dateStrs.length; i++) {
                // 调用服务获取每天的数据量
                nums[i] = iBaseCustomService.getWeekList(dateStrs[i]);
            }

            // 存储另一个每天的数据量数组（重复计算）
            int[] nums2 = new int[dateStrs2.length];
            // 遍历另一个日期字符串数组
            for (int i = 0; i < dateStrs2.length; i++) {
                // 调用服务获取每天的数据量
                nums2[i] = iBaseCustomService.getWeekList(dateStrs2[i]);
            }

            // 将数据量数组存入Map
            Map messages = new HashMap();
            messages.put("expectedData",nums2);
            messages.put("actualData",nums);
            messages.put("cloums",cloums);

            map.put("messages",messages);

            // 返回结果
            return map;
        }
        /**
         * 获取最近7天数据
         */
        public Map getNowWeekData(Map Datemap,String[] cloums) {
            // 获取日期字符串数组
            String[] dateStrs = (String[])Datemap.get("dateStrs");
            // 获取另一个日期字符串数组（重复计算）
            String[] dateStrs2 = (String[])Datemap.get("dateStrs2");
            // 创建一个Map对象用于存储结果
            Map map = new HashMap();
            // 存储每天的数据量数组
            // 获取数据量
            int[] nums = new int[dateStrs.length];
            // 遍历日期字符串数组
            for (int i = 0; i < dateStrs.length; i++) {
                // 调用服务获取每天的数据量
                nums[i] = iBaseAccountService.getWeekList(dateStrs[i]);
            }

            // 存储另一个每天的数据量数组（重复计算）
            int[] nums2 = new int[dateStrs2.length];
            // 遍历另一个日期字符串数组
            for (int i = 0; i < dateStrs2.length; i++) {
                // 调用服务获取每天的数据量
                nums2[i] = iBaseAccountService.getWeekList(dateStrs2[i]);
            }

            // 将数据量数组存入Map

            Map newVisitis = new HashMap();
            newVisitis.put("expectedData",nums2);
            newVisitis.put("actualData",nums);
            newVisitis.put("cloums",cloums);

            map.put("newVisitis",newVisitis);
            // 返回结果
            return map;
        }




}
